package com.sergio.accounting.service;

import com.sergio.accounting.dto.RecordDTO;
import com.sergio.accounting.dto.RecordResponseDTO;
import com.sergio.accounting.dto.StatisticsDTO;
import com.sergio.accounting.entity.Record;

import java.time.LocalDate;
import java.util.List;

/**
 * 记账记录服务接口
 */
public interface RecordService {

    /**
     * 添加记账记录
     */
    Record addRecord(Long userId, RecordDTO recordDTO);

    /**
     * 更新记账记录
     */
    Record updateRecord(Long userId, Long recordId, RecordDTO recordDTO);

    /**
     * 删除记账记录
     */
    boolean deleteRecord(Long userId, Long recordId);

    /**
     * 根据ID查找记录
     */
    Record findById(Long id);

    /**
     * 根据用户ID查找记录
     */
    List<Record> findByUserId(Long userId);

    /**
     * 根据用户ID和记录类型查找记录
     */
    List<Record> findByUserIdAndType(Long userId, String recordType);

    /**
     * 根据用户ID和日期范围查找记录
     */
    List<Record> findByUserIdAndDateRange(Long userId, LocalDate startDate, LocalDate endDate);

    /**
     * 根据用户ID和日期范围查找记录（返回DTO）
     */
    List<RecordResponseDTO> findByUserIdAndDateRangeAsDTO(Long userId, LocalDate startDate, LocalDate endDate);

    /**
     * 根据用户ID、记录类型和日期范围查找记录
     */
    List<Record> findByUserIdAndTypeAndDateRange(Long userId, String recordType, LocalDate startDate, LocalDate endDate);

    /**
     * 获取统计数据
     */
    StatisticsDTO getStatistics(Long userId, LocalDate startDate, LocalDate endDate);

    /**
     * 获取概览数据
     */
    StatisticsDTO.OverviewDTO getOverview(Long userId);

    /**
     * 获取趋势数据
     */
    List<StatisticsDTO.TrendDTO> getTrend(Long userId, LocalDate startDate, LocalDate endDate);

    /**
     * 获取分类统计
     */
    List<StatisticsDTO.CategoryStatsDTO> getCategoryStats(Long userId, String recordType, LocalDate startDate, LocalDate endDate);

    /**
     * 获取排行榜
     */
    List<StatisticsDTO.RankingDTO> getRanking(Long userId, String recordType, LocalDate startDate, LocalDate endDate);

    /**
     * 根据账户ID查找记录
     */
    List<RecordResponseDTO> findByAccountId(Long accountId, Long userId);

    /**
     * 根据账户ID和日期范围查找记录
     */
    List<RecordResponseDTO> findByAccountIdAndDateRange(Long accountId, Long userId, LocalDate startDate, LocalDate endDate);
}
